﻿using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;

namespace SiGeCoPre.Presupuesto_Util
{
    /// <summary>
    /// Clase que proporciona herramientas para la aplicación
    /// </summary>
    class Herramientas
    {
        /// <summary>
        /// Crea un backup de la base de datos
        /// </summary>
        public static void Backup()
        {
            try
            {
                string ruta = Application.StartupPath + @"\Backup\";

                comprobarDirectorio(ruta);

                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Title = "Guardar Copia de Seguridad";
                sfd.Filter = "SQL File|*.sql";
                sfd.InitialDirectory = ruta;
                String hoy = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString(); 
                sfd.FileName = "presupuestos." + hoy + ".sql";

                if (sfd.ShowDialog() != DialogResult.Cancel)
                {
                    if (!sfd.FileName.Equals(""))
                    {
                        string file = sfd.FileName;
                        MySqlConnection con = Conexion.conexionMySQL();
                        MySqlBackup mb = new MySqlBackup(con);
                        mb.ExportInfo.FileName = file;
                        mb.Export();
                        MessageBox.Show("Copia de Seguridad Realizada!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                
            }
            catch (Exception ex)
            {

                MessageBox.Show("Error al intentar realizar la Copia de Seguridad!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Texto.escribirLog(ex.Message);
            }
            
        }

        /// <summary>
        /// Recupera un backup de la base de datos
        /// </summary>
        public static void Restore()
        {
            try
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Title = "Recuperar Copia de Seguridad";
                ofd.InitialDirectory = Application.StartupPath + @"\Backup\";

                if (ofd.ShowDialog() != DialogResult.Cancel)
                {
                    if (!ofd.FileName.Equals(""))
                    {
                        string file = ofd.FileName;
                        MySqlConnection con = Conexion.conexionMySQL();
                        MySqlBackup mb = new MySqlBackup(con);
                        mb.ImportInfo.FileName = file;
                        mb.Import();
                        MessageBox.Show("Copia de Seguridad Recuperada!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                
            }
            catch (Exception ex)
            {
                
                MessageBox.Show("Error al intentar recuperar la Copia de Seguridad!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Texto.escribirLog(ex.Message);
            }
            
        }

        /// <summary>
        /// Comprueba la existencia de un directorio
        /// </summary>
        /// <param name="ruta">Determina la ruta del directorio a comprobar</param>
        public static void comprobarDirectorio(string ruta)
        {
            if (!(Directory.Exists(ruta)))
            {
                Directory.CreateDirectory(ruta);
            } 
        }

        /// <summary>
        /// Elimina un archivo existente
        /// </summary>
        /// <param name="ruta">Determina el archivo a eliminar</param>
        public static void eliminarArchivo(string ruta)
        {
            if (File.Exists(ruta))
            {
                File.Delete(ruta);
            }
        }

        /// <summary>
        /// Abre un archivo existente
        /// </summary>
        /// <param name="ruta">Determina el archivo a abrir</param>
        public static void abrirArchivo(string ruta)
        {
            if (File.Exists(ruta))
            {
                System.Diagnostics.Process.Start(ruta);
            }
            else
            {
                MessageBox.Show("El archivo no está accesible!","Alerta",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
                Texto.escribirLog("Error en abrirArchivo");
            }
        }

        /// <summary>
        /// Cierre un proceso específico
        /// </summary>
        /// <param name="proceso">Determina el proceso a cerrar</param>
        public static void cerrarProceso(string proceso)
        {
          foreach (Process p in Process.GetProcesses())
          {
              if (p.ProcessName.Equals(proceso))
              {
                  p.Kill();
                  break;
              }
          }
        
        }
    }
}
